package com.zzw.springboot.controller;

import com.zzw.springboot.util.DataMigrationUtil;
import com.zzw.springboot.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据迁移控制器
 */
@Api(tags = "数据迁移")
@RestController
@RequestMapping("/migration")
@Slf4j
public class DataMigrationController {

    @Autowired
    private DataMigrationUtil migrationUtil;

    /**
     * 检查分表是否创建
     */
    @ApiOperation("检查分表是否存在")
    @GetMapping("/checkTables")
    public Result checkTables() {
        boolean exists = migrationUtil.checkTablesCreated();
        if (exists) {
            return Result.success("分表已全部创建");
        } else {
            return Result.error("部分或全部分表未创建，请先执行建表脚本");
        }
    }

    /**
     * 获取原表和分片表的记录数
     */
    @ApiOperation("获取数据统计")
    @GetMapping("/stats")
    public Result getStats() {
        Map<String, Object> stats = new HashMap<>();
        
        try {
            // 获取分表记录总数
            long shardingCount = migrationUtil.countShardingRecords();
            stats.put("shardingCount", shardingCount);
            
            return Result.success(stats);
        } catch (Exception e) {
            log.error("获取数据统计失败", e);
            return Result.error("获取数据统计失败：" + e.getMessage());
        }
    }

    /**
     * 启动数据迁移
     */
    @ApiOperation("启动用户表数据迁移")
    @PostMapping("/users")
    public Result migrateUsers(@RequestParam(defaultValue = "1000") int batchSize) {
        try {
            int migratedCount = migrationUtil.migrateData(batchSize);
            
            Map<String, Object> result = new HashMap<>();
            result.put("migratedCount", migratedCount);
            
            return Result.success(result, "数据迁移完成");
        } catch (Exception e) {
            log.error("数据迁移失败", e);
            return Result.error("数据迁移失败：" + e.getMessage());
        }
    }

    /**
     * 验证数据一致性
     */
    @ApiOperation("验证数据迁移一致性")
    @GetMapping("/validate")
    public Result validateMigration() {
        try {
            boolean valid = migrationUtil.validateMigration();
            
            if (valid) {
                return Result.success("数据迁移验证通过，原表和分表数据一致");
            } else {
                return Result.error("数据迁移验证失败，原表和分表数据不一致");
            }
        } catch (Exception e) {
            log.error("验证数据迁移一致性失败", e);
            return Result.error("验证数据迁移一致性失败：" + e.getMessage());
        }
    }
} 